package jk.zmn.server.core;

import java.awt.List;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 封装http请求信息
 * @author zmn
 *
 */
public class Request {
	
	//定义响应中的换行
	private static final String CRLF="\r\n";
	//请求方法
	private String method;
	//请求路径
	private String url;
	//请求参数
	private Map<String, ArrayList<String>> paramentMap;
	//请求
	private String requestInfo;
	//输入流
	
	private InputStream inputStream;
	
	
	public Request() {
		method="";
		url="";
		paramentMap = new HashMap<>();
	}
	public Request(InputStream inputStream) {
		this();
		this.inputStream = inputStream;
		
		//从输入流中取出请求信息
		try {
			byte[] data = new byte[20480];
			int len = inputStream.read(data);
			requestInfo=new String(data, 0, len);
			//解析请求信息
			parseRequestInfo();
		} catch (Exception e) {
			return;
		}
		
	}
	/**
	 * 解析请求信息
	 * @param requestInfo2
	 */
	private  void parseRequestInfo() {
		
		if(requestInfo==null || requestInfo.trim().equals("")) {
			return;
		}
		String paramentString="";//保存请求参数
		//得到请求第一行数据
		String firstLine = requestInfo.substring(0, requestInfo.indexOf(CRLF));
		
		//第一个/的位置
		int index = firstLine.indexOf("/");
		this.method = firstLine.substring(0,index).trim();
		
		String urlString = firstLine.substring(index,firstLine.indexOf("HTTP/")).trim();
		//判断请求方式
		if (method.equalsIgnoreCase("post")) {
			
			url = urlString;
			//最后一行就是参数
			paramentString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
		}else if (method.equalsIgnoreCase("get"))  {
			if (!urlString.contains("?")) {
				this.url = urlString;
			}else {
				//分割url
				String[] urlArray = urlString.split("\\?");
				this.url = urlArray[0];
				paramentString = urlArray[1];
			}
			
		}
		
		if (paramentString!=null&&!paramentString.trim().equals("")) {
			//解析请求参数
			parseParament(paramentString);
		}
		
		
	}
	
	/**
	 * 解决中文乱码
	 * @param value
	 * @param code
	 * @return
	 */
	private String decode(String value,String code) {
		try {
			return URLDecoder.decode(value, code);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 解析请求参数，放在数组里面
	 *   name=12&age=13&fav=1&fav=2
	 */
	private void parseParament(String paramentString) {
		
		String[] paramentsArray = paramentString.split("&");
		
		for(String string:paramentsArray) {
			//某个键值对的数组
			String[] paramentArray = string.split("=");
			//如果该键没有值，设值为null
			if (paramentArray.length==1) {
				paramentArray = Arrays.copyOf(paramentArray, 2);
				paramentArray[1]=null;
			}
			
			String key = paramentArray[0];
			String value = paramentArray[1]==null?null:decode(paramentArray[1].trim(), "utf8");
			
			//分拣法
			if (!paramentMap.containsKey(key)) {
				paramentMap.put(key,new ArrayList<String>());
			}
			
			//设值
			ArrayList<String> values = paramentMap.get(key);
			values.add(value);
		}
		
		
	}
	
	
	/**
	 * 根据key得到多个值
	 */
	public String[] getParamenters(String name) {
		ArrayList<String> values =null;
		if ((values=paramentMap.get(name))==null) {
			return null;
		}else {
			return  values.toArray(new String[0]);
		}
	}
	
	/**
	 * 根据key得到值
	 */
	public String getParamenter(String name) {
		
		if ((paramentMap.get(name))==null) {
			return null;
		}else {
			return getParamenters(name)[0];
		}
	}
	
	public String getUrl() {
		return url;
	}
	
	
	
	
	

}
